package br.com.hstar.client.produto.produto;

import java.util.Iterator;
import java.util.List;

import br.com.hstar.client.ServiceFactory;
import br.com.hstar.client.produto.grupo.GrupoUI;
import br.com.hstar.client.util.FormPanel;
import br.com.hstar.client.util.HstarDialogBox;
import br.com.hstar.client.util.HstarUserException;
import br.com.hstar.client.util.calendar.DatePicker;

import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;

public class ProdutoEditPanel extends FormPanel {

	private Button incluir;
	private Button cancelar;
	private Button excluir;

	private TextBox nome;
	private TextBox codigo;
	private TextBox marca;
	private TextBox unidadeMedida;
	private TextBox quantidadeConsumo;
	private TextBox peso;
	private TextBox precoCompra;
	private TextBox precoMedioCompra;
	private DatePicker dataUltimaCompra;
	private DatePicker dataVencimento;
	private TextBox precoVenda;
	private TextBox precoMedioVenda;
	private DatePicker dataUltimaVenda;
	private TextBox valorMargem;
	private TextBox percentualMargem;
	private TextBox lec;
	private TextBox classificacaoABC;
	private ListBox grupo;
	private ProdutoUI produtoUI;

	public ProdutoEditPanel(String _title) {
		super(_title);
		produtoUI = new ProdutoUI();
		init(true);
	}

	public ProdutoEditPanel(String _title, Long id) {
		super(_title);
		produtoUI = new ProdutoUI();
		produtoUI.setId(id);
		init(false);
		ServiceFactory.createProdutoService().retrieveById(id, new RetrieveAsyncCallback());
	}



//	Methods -------------------------------------------------------------------

	private void init(boolean isNew) {

		nome				= addTextBox("Nome", 30, 30, "");
		dataVencimento  	= addCalendar("Data de Vencimento");
		codigo				= addTextBox("Código", 20, 20, "");
		marca				= addTextBox("Marca", 30, 30, "");
		unidadeMedida		= addTextBox("Unidade de Medida", 30, 30, "");
		quantidadeConsumo	= addTextBox("Quantidade de Consumo", 8, 12, "");
		peso				= addTextBox("Peso", 8, 12, "");
		precoCompra			= addTextBox("Preço Compra", 8, 12, "");
		precoMedioCompra	= addTextBox("Preço Médio Compra", 8, 12, "");
		dataUltimaCompra	= addCalendar("Última Compra");
		precoVenda			= addTextBox("Preço Venda", 8, 12, "");
		precoMedioVenda		= addTextBox("Preço Médio Venda", 8, 12, "");
		dataUltimaVenda		= addCalendar("Última Venda");
		valorMargem			= addTextBox("Valor da Margem", 8, 12, "");
		percentualMargem	= addTextBox("Percentual da Margem", 8, 12, "");
		lec					= addTextBox("LEC", 8, 12, "");
		classificacaoABC	= addTextBox("Classificação", 8, 12, "");
		grupo				= addListBox("Grupo", true);
		ServiceFactory.createGrupoService().listAll(new ListAllGrupoAsyncCallback());


		if(isNew) {
			incluir  = addButton("Incluir");
			cancelar = addButton("Cancelar");
		} else {
			incluir  = addButton("Alterar");
			cancelar = addButton("Cancelar");
			excluir = addButton("Excluir");
			excluir.addClickListener(new ClickListener() {
				public void onClick(Widget sender) {
					ServiceFactory.createProdutoService().delete(produtoUI.getId(), new DeleteAsyncCallback());
				}
			});
		}

		incluir.addClickListener(new ClickListener() {
			public void onClick(Widget sender) {
				try {
					copyData();
					ServiceFactory.createProdutoService().saveOrUpdate(produtoUI, new SaveAsyncCallback());
				} catch (HstarUserException e) {
					new HstarDialogBox("Produto", e.getMessage());
				}

			}
		});
		cancelar.addClickListener(new ClickListener() {
			public void onClick(Widget sender) {
				RootPanel.get("boxContent").clear();
				RootPanel.get("boxContent").add(new ProdutoListPanel("Produto"));
			}
		});

	}

	private void copyData() throws HstarUserException {


		String msgErro = "";

		if(grupo.getSelectedIndex() < 1)
		{			
			msgErro = " - Selecione um grupo <br>";
		}

		if(nome.getText().trim() == "")
		{			
			msgErro += " - Digite o nome do produto <br>";
		}

		if(codigo.getText().trim() == "")
		{			
			msgErro += " - Digite o codigo do produto <br>";
		}

		if(marca.getText().trim() == "")
		{			
			msgErro += " - Digite a marca do produto <br>";
		}

		if(unidadeMedida.getText().trim() == "")
		{			
			msgErro += " - Digite a unidade de medida do produto <br>";
		}

		try{
			produtoUI.setQuantidadeConsumo(new Integer(quantidadeConsumo.getText().trim()));
		} catch (NumberFormatException nf) {
			msgErro += " - Quantidade de consumo deve ser um número inteiro <br>";
		}		


		try{
			produtoUI.setPrecoCompra(new Float(precoCompra.getText().trim()));
		} catch (NumberFormatException nf) {
			msgErro += " - Preco de compra deve ser do tipo monetário(Ex: 11,43)<br>";
		}


		try{
			produtoUI.setPrecoVenda(new Float(precoVenda.getText().trim()));
		} catch (NumberFormatException nf) {
			msgErro += " - Preco de venda deve ser do tipo monetário (Ex: 11,43)<br>";
		}	


		if(msgErro != "")
		{
			throw new HstarUserException(msgErro);			
		}

		produtoUI.setGrupo(
				new GrupoUI(new Long(grupo.getValue(grupo.getSelectedIndex()))));

		produtoUI.setNome(nome.getText().trim());
		produtoUI.setCodigo(codigo.getText().trim());
		produtoUI.setMarca(marca.getText().trim());
		produtoUI.setUnidadeMedida(unidadeMedida.getText().trim());
		produtoUI.setDataUltimaCompra(dataUltimaCompra.getSelectedDate());
		produtoUI.setDataVencimento(dataVencimento.getSelectedDate());
		produtoUI.setDataUltimaVenda(dataUltimaVenda.getSelectedDate());
		produtoUI.setClassificacaoABC(classificacaoABC.getText().trim());	
	}

//	INNER CLASSES ----------------------------------------------------------------
	private class SaveAsyncCallback implements AsyncCallback {
		public void onFailure(Throwable caught) {
			if(caught instanceof HstarUserException)
			{					
				new HstarDialogBox("Produto",caught.getMessage());
			}			
		}

		public void onSuccess(Object result) {
			RootPanel.get("boxContent").clear();
			RootPanel.get("boxContent").add(new ProdutoListPanel("Produto"));
		}
	}

	private class DeleteAsyncCallback implements AsyncCallback {
		public void onFailure(Throwable caught) {
			Window.alert("ERRO - Produto edit panel");
		}

		public void onSuccess(Object result) {
			RootPanel.get("boxContent").clear();
			RootPanel.get("boxContent").add(new ProdutoListPanel("Produto"));
		}
	}

	//carrega os campos. Usado para quando está editando
	private class RetrieveAsyncCallback implements AsyncCallback {
		public void onFailure(Throwable caught) {
			Window.alert("ERRO - Produto");
		}

		public void onSuccess(Object result) {
			ProdutoUI produto = (ProdutoUI)result;

			nome.setText(produto.getNome().trim());
			codigo.setText(produto.getCodigo().trim());
			marca.setText(produto.getMarca().trim());
			unidadeMedida.setText(produto.getUnidadeMedida().trim());
			quantidadeConsumo.setText((produto.getQuantidadeConsumo() != null)?produto.getQuantidadeConsumo().toString():"");
			peso.setText((produto.getPeso()!=null)?produto.getPeso().toString():"");
			precoCompra.setText((produto.getPrecoCompra() != null)?produto.getPrecoCompra().toString():"");
			precoMedioCompra.setText((produto.getPrecoMedioCompra()!= null)?produto.getPrecoMedioCompra().toString():"");
			dataUltimaCompra.setText(produto.getDataUltimaCompra());
			dataVencimento.setText(produto.getDataVencimento());
			precoVenda.setText((produto.getPrecoVenda()!= null)?produto.getPrecoVenda().toString():"");
			precoMedioVenda.setText((produto.getPrecoMedioVenda()!= null)?produto.getPrecoMedioVenda().toString():"");
			dataUltimaVenda.setText(produto.getDataUltimaVenda());
			valorMargem.setText((produto.getValorMargem()!= null)?produto.getValorMargem().toString():"");
			percentualMargem.setText((produto.getPercentualMargem()!= null)?produto.getPercentualMargem().toString():"");
			lec.setText((produto.getLec() != null)?produto.getLec().toString():"");
			classificacaoABC.setText(produto.getClassificacaoABC().toString());


			if (grupo != null && produto.getId() != null) {
				for(int i = 0; i < grupo.getItemCount(); i++) {
					if(grupo.getItemText(i).equals(produto.getGrupo().getValue(1))) {
						grupo.setSelectedIndex(i);
						break;
					}
				}
			}			
		}
	}



	//lista todos os gropos para colocar no listbox
	private class ListAllGrupoAsyncCallback implements AsyncCallback {
		public void onFailure(Throwable caught) {
			Window.alert("ERRO ao listar Produto");
		}

		public void onSuccess(Object result) {
			List grupos = (List) result;
			for (Iterator iter = grupos.iterator(); iter.hasNext();) {
				GrupoUI grupoUI = (GrupoUI) iter.next();
				grupo.addItem(grupoUI.getNome(), grupoUI.getId().toString());				
			}
		}
	}

}      